#pragma once
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "log.hpp"
#include "common.hpp"
using namespace LogModule;
// 第一个参数如果为0改变工作目录为根目录，
// 第二个参数为0代表把标准输入标准输出标准错误重定向到/dev/null
std::string workpath = "/dev/null";
void Daemon(int nochdir, int noclose)
{

    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);
    pid_t id = fork();
    if (fork() > 0)
        exit(OK);
    // 子进程
    // 建立新会话并成为新会话的首进程组
    setsid();
    if (nochdir == 0)
    {
        chdir("/");
    }
    if (noclose == 0)
    {
        // du读写方式打开
        int fd = open(workpath.c_str(), O_RDWR);
        if (fd < 0)
        {
            LOG(LogLevel::FATAL) << "open " << workpath << " errno";
            exit(OPEN_ERR);
        }
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);
    }
    else
    {
        close(0);
        close(1);
        close(2);
    }
}